VBcrackme 解析手引き「VBCrack1」
はじめに、VBCrack1を直に実行してみましょう。 @ 起動時に5秒間表示 A 起動10秒後に表示 B 終了時に表示 と合計3つのナグが表示されます。 補助ツール ExDec(VB DeComplier)で、P-Codeリストは作成してますね? まだなら今のうちです。 ここは、続けます。 WKTVBDE を起動します。 VBCrack1.exe を読込みます。 すばやく「Action」→「Run」又は、ツールバーの「Run」で実行します。 VBCrack1.exeがロードされて、最初に実行されるP-Code命令でブレークします。 ここで余談 前回・前々回のVBCrack2と、VBXrack3では、「Run」直後に対象APのウィンドウがすぐに表示されました。 今回の、VBCrack1では、ウィンドウ表示前にWKTVBDEでブレークします。 「Run」直後に、ブレークする場合としない場合の違いは、解析対象APがウィンドウを表示する前に、 実行コードの有無により変ります。 本題に戻りまして、 ExDecで作成した、P-Codeリストを見ると、 402EB8: 24 NewIfNullPr 4014c8 (frmSplash) 402EBB: 0d VCallHresult meth__imethSHOW 上記、2行でfrmSplashフォームを表示(ウィンドウの表示)を行っています。 0x402EBBにブレークポイントを設定して、「Go!(F5)」で実行します。 0x402EBBでブレークします。 ここで、WKTVBDEのP-Codeリストを見ると、 402EC5: f5 LitI4: 0x1388 5000 402ECA: 0a ImpAdCallFPR4 kernel32!Sleep 402ECF: 3c SetLastSystemError ← APIコールの結果取得 と5秒のスリープ処理があります。 0x402EB8 〜 0x402ECF で1つ目のナグ表示処理を行っています。 さて、1つ目のナグ消しパッチを作ります。 パッチ位置は、今ブレークしている 0x402EBB(ファイルオフセット:0x2EBB) Branch(0x1e)命令を使用して、ナグ表示処理をスキップします。 ブランチ先は、「402ECF: 3c SetLastSystemError」の後、「402ED0: 05 ImpAdLdRf」に飛ばすようにします。 ブランチオフセットの計算 0x402ED0(ブランチ先) - 0x402E3C(コードの先頭) = 0x94 となります。 パッチイメージは、 0x1e 0x94 0x00 となりますが、ここでパッチ元のP-Code(WKTVBDEにOp: xx xx と表示) を見ると、0x0d 0xb0 0x02 0x07 0x00 と5バイトとなってます。 このまま3バイトパッチを当てると、後ろ2バイトがP-Codeと解釈され誤動作の可能性がありそうです。 ここで、2バイトのP-Codeをダミーで追加します。 Opcodes(Ctrl+O)を参照し、LargeBos(0x00)の2バイト命令を使用します。 (この命令は、何をしているか分かりませんが、実行されない部分なので問題無いでしょう。) よって、5バイトのパッチイメージは、 0x1e 0x94 0x00 0x00 0x00 となります。 それでは、コードの書換えを行います。 WKTVBDEの「Edit」ボタンをクリックします。 「Memort viewer and editor」ウィンドウが表示されます。 コードを変更するには、ダンプ部分をWクリックする必要があります。 0x00402EBB と表示されてる部分をWクリックします。 すると、数値が入力出来る様になりましたね。 0x0d 0xb0 0x02 0x07 0x00 → 0x1e 0x94 0x00 0x00 0x00 に変更して、「Patch Now」ボタンをクリックします。 WKTVBDEのP-Code表示が、 402EBB: 1E Branch 00402ED0 (Jump) 402EBE: 00 LargeBos と表示が変りました。 次は、 402EF8: 24 NewIfNullPr 401738 (frmMain) 402EFB: 0d VCallHresult meth__imethSHOW frmMainフォームを表示部分、0x402EFB にブレークポイントを設定して処理を続けます。 この時に、最初のナグが表示されないのを確認します。 「Step Trace(F8)」で、1ステップ実行すると、 WKTVBDEのP-Code表示が、frmMainフォームのロード処理に切替わります。 ここであわてずに、「Step Trace(F8)」で、0x402C78: 13 ExitProcHresult を実行するまで進めると、 402EF8: 24 NewIfNullPr 401738 (frmMain) 402EFB: 0d VCallHresult meth__imethSHOW 402F00: f5 LitI4: 0x2710 10000 ← ここに戻る。 また、ここでWKTVBDEのP-Code表示を見ると、 402F14: 0d VCallHresult put ipropINTERVALTIMER 402F2D: 0d VCallHresult put ipropENABLEDTIMER と、xxxxTIMERコールする箇所があります。 ここで注目する箇所は、「402F2D: 0d VCallHresult put ipropENABLEDTIMER」です。 ここで、Timerの有効無効の設定を行っています。 402F1C: f4 LitI2_Byte: 0xff 255 この値は、VBのtrue値です。 起動10秒後に表示されるナグは、Timerを使って表示しています。 よって、このTimerを無効(false)にする事で、回避する事ができますね。 パッチイメージは、「402F1C: f4 LitI2_Byte: 0xff 255」の 0xff を 0x00 に変更します。 「Step Trace(F8)」等を使用して、カーソルが 0x402F1C にくるまで、実行させます。 次に、「Edit」ボタンをクリックして、0xf4 0xff の2バイト目を、0x00 に変更します。 ファイルオフセット値は、0x2F1Dとなります。 さて、3つ目のナグ消しに入ります。 「Form Manager(Ctrl+F)」で、「Form Manager」ウィンドウを表示します。 「Command」をクリック、さらに「▼」をボタンクリックして、「cmdQuit」を選択します。 そして、「BPX」ボタンをクリックして、ブレークポイントを設定します。 「Go!(F5)」で、実行します。 ここで、10秒ほど放置してナグが表示されない事を確認しましょう。 「終了」ボタンを、クリックします。 さきほど設定したブレークポイントで止まります。 402B39: 0d VCallHresult CVBApplication::Unload にカーソルがくるまで実行させます。 「Step Trace(F8)」で、ステップ実行します。 WKTVBDEのP-Codeが、Unloadの処理に切替わります。 402BD0: 27 LitVar_Missing 0012F230h 402BD3: 27 LitVar_Missing 0012F250h 402BD6: 27 LitVar_Missing 0012F270h 402BD9: f5 LitI4: -> 0x0 0 402BDE: 3a LitVarStr: '3個目のNag(修了時に表示)' 402BE3: 4e FStVarCopyObj 0012F290h 402BE6: 04 FLdRfVar 0012F290h 402BE9: 0a ImpAdCallFPR4: rtcMsgBox on address 660E1FF2h 402BEE: 36 FFreeVar -> 4 402BF9: 13 ExitProcHresult と上記の様に表示されます。(何度も言いますが、漢字表示部分は、Win9x系OSでは化けてます。) この処理でのナグ表示は、 402BE9: 0a ImpAdCallFPR4: rtcMsgBox on address 660E1FF2h です。 カーソルが、0x402BE9 にくるまで実行させます。 今回も、1個目のナグ消しの要領で表示命令を、ブランチ命令に変更します。 ブランチ先は、「0x402BEE: 36 FFreeVar -> 4」になるようにオフセットを計算します。 0x402BEE - 0x402BD0 = 0x1e 書換え側の命令は5バイトなので、後ろ2バイトを0x00にして、 0x1e 0x1e 0x00 0x00 0x00 となります。 ファイルオフセットは、0x2be9 ですね。 それでは、コードを変更して、「Go!(F5)」! ナグでないのを確認してみて下さい。 「 Debugging session finished. 」とWKTVBDEが言ってきたら成功です。 今回のパッチ・イメージ張りつけます。 00002BE9: 0A 1E 00002BEA: 0D 1E 00002BEC: 14 00 00002EBB: 0D 1E 00002EBC: B0 94 00002EBD: 02 00 00002EBE: 07 00 00002F1D: FF 00 これは、1例に過ぎないと思います。 参考として、二個目のナグ部分は ブランチ を使って 2F00: F5 1E 2F01: 10 F9 2F02: 27 00 とパッチすると、Timerの処理をスキップになります。
これで、VBcrackmeは全て終了しました。長らくお付き合い下さりありがとうございました!